/*
 * Copyright 2023-2025, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _KERNEL_ARCH_LOONGARCH64_CPU_DEFS_H
#define _KERNEL_ARCH_LOONGARCH64_CPU_DEFS_H

// 龙芯架构CSR寄存器定义
#define CSR_CRMD      0x0     // 当前模式信息
#define CSR_PRMD      0x1     // 上一次模式信息
#define CSR_EUEN      0x2     // 扩展单元使能
#define CSR_MISC      0x3     // 杂项
#define CSR_ECFG      0x4     // 异常配置
#define CSR_ESTAT     0x5     // 异常状态
#define CSR_ERA       0x6     // 异常返回地址
#define CSR_BADV      0x7     // 异常访问地址
#define CSR_BADI      0x8     // 异常指令
#define CSR_EENTRY    0xc     // 异常入口地址
#define CSR_TLBIDX    0x10    // TLB索引
#define CSR_TLBEHI    0x11    // TLB入口高位
#define CSR_TLBELO0   0x12    // TLB入口低位0
#define CSR_TLBELO1   0x13    // TLB入口低位1
#define CSR_ASID      0x18    // 地址空间标识符
#define CSR_PGDL      0x19    // 页表基址低位
#define CSR_PGDH      0x1a    // 页表基址高位
#define CSR_PGD       0x1b    // 页表基址
#define CSR_CPUID     0x20    // CPU ID
#define CSR_SAVE0     0x30    // 保存寄存器0
#define CSR_SAVE1     0x31    // 保存寄存器1
#define CSR_SAVE2     0x32    // 保存寄存器2
#define CSR_SAVE3     0x33    // 保存寄存器3
#define CSR_TID       0x40    // 线程ID
#define CSR_TCFG      0x41    // 定时器配置
#define CSR_TVAL      0x42    // 定时器值
#define CSR_CNTC      0x43    // 定时器比较值
#define CSR_TICLR     0x44    // 定时器中断清除
#define CSR_LLBCTL    0x60    // LLBit控制
#define CSR_IMPCTL1   0x80    // 实现相关控制1
#define CSR_IMPCTL2   0x81    // 实现相关控制2

// CRMD寄存器位定义
#define CRMD_PLV_MASK 0x3     // 特权级掩码
#define CRMD_PLV_KERN 0x0     // 内核特权级
#define CRMD_PLV_USER 0x3     // 用户特权级
#define CRMD_IE       0x4     // 中断使能位
#define CRMD_DA       0x8     // 直接地址翻译位
#define CRMD_PG       0x10    // 分页使能位
#define CRMD_DATF     0x60    // 数据访问类型
#define CRMD_DATM     0x180   // 数据访问模式

// ECFG寄存器位定义
#define ECFG_IM       0xffffffffUL  // 中断屏蔽位
#define ECFG_VS       0x300000000UL  // 向量模式选择
#define ECFG_VS_OFF   0x0           // 向量关闭
#define ECFG_VS_2     0x100000000UL // 向量2位模式
#define ECFG_VS_4     0x200000000UL // 向量4位模式

// ESTAT寄存器位定义
#define ESTAT_IS      0xffffffffUL  // 中断源
#define ESTAT_ECODE   0xff00000000UL // 异常代码
#define ESTAT_ESUBCODE 0xff0000000000UL // 异常子代码

// PRMD寄存器位定义
#define PRMD_PPLV     0x3           // 上一次特权级
#define PRMD_PIE      0x4           // 上一次中断使能

// EUEN寄存器位定义
#define EUEN_FPE      0x1           // 浮点使能
#define EUEN_SXE      0x2           // LSX使能
#define EUEN_ASXE     0x4           // LASX使能

// MISC寄存器位定义
#define MISC_EXST     0x1           // 异常状态

// LLBCTL寄存器位定义
#define LLBCTL_ROLLB  0x1           // 回滚标志
#define LLBCTL_WCLLB  0x2           // 写入清除LLbit
#define LLBCTL_KLO    0x4           // 内核锁定

// TLBIDX寄存器位定义
#define TLBIDX_IDX    0xfff         // TLB索引
#define TLBIDX_PS     0x3f000       // 页大小
#define TLBIDX_NE     0x40000       // 不存在标志

// TLBEHI寄存器位定义
#define TLBEHI_VPPN   0xffffffffffffUL // 虚拟页号

// TLBELO寄存器位定义
#define TLBELO_V      0x1           // 有效位
#define TLBELO_D      0x2           // 脏位
#define TLBELO_PLV    0xc           // 特权级
#define TLBELO_MAT    0x70          // 内存属性
#define TLBELO_G      0x80          // 全局位
#define TLBELO_PPN    0xffffffe000UL // 物理页号

// ASID寄存器位定义
#define ASID_ASID     0xffff        // 地址空间标识符
#define ASID_ASIDBITS 0xff0000      // ASID位数

// TCFG寄存器位定义
#define TCFG_EN       0x1           // 定时器使能
#define TCFG_PERIODIC 0x2           // 周期模式
#define TCFG_INITVAL  0xfffffffcUL  // 初始值

// TICLR寄存器位定义
#define TICLR_CLR     0x1           // 清除定时器中断